home *** CD-ROM | disk | FTP | other *** search
- /*
- * Uhr.c
- *
- * Author: Stefan Sticht
- *
- * Copyright: source is public domain, no copyright
- *
- * Version history:
- *
- * V0.01 initial release
- * V0.02 using now cback.o
- * V0.03 RMBTRAP flag set
- * V0.04 added LockIBase before looking at IntuitionBase
- * (thanks to Holger Gzella for bug report),
- * added screen title
- * V0.05 structure for timerequest is now in MEMF_PUBLIC
- * (thanks to Holger Gzella)
- * now using CreateMsgPort() from exec.library instead of CreatePort() from amiga.lib
- * V0.06 changed LockPubScreen("Workbench") to LockPubScreen(NULL)
- * now using CreateIORequest(); using WaitIO() instead of Wait() after AbortIO()
- * removed LockIBase(), redefined SAS/C chkabort() to prevent CTRL/C trapping
- * V0.07 14 Sep 1991 small changes to reduce size
- * V1.00 13 May 1992 mow uses locale.library's FormatDate()
- * V1.01 19 Sep 1992 small changes, reduced size
- */
-
- #define VERSION "1.01"
-
- #include <stdarg.h>
- #include <stdlib.h>
- #include <string.h>
- #include <devices/timer.h>
- #include <exec/memory.h>
- #include <intuition/intuitionbase.h>
- #include <libraries/locale.h>
- #include <workbench/icon.h>
- #include <workbench/startup.h>
- #include <clib/alib_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/exec_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/icon_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/locale_protos.h>
- #include <pragmas/dos_pragmas.h>
- #include <pragmas/exec_pragmas.h>
- #include <pragmas/graphics_pragmas.h>
- #include <pragmas/icon_pragmas.h>
- #include <pragmas/intuition_pragmas.h>
- #include <pragmas/locale_pragmas.h>
-
- /*
- * prototypes
- */
- long request(char *title, char *gadgets, char *text, ...);
- struct Library __regargs *myopenlibrary(char *name, unsigned long version);
- void getmessages(struct Window *win);
- void __saveds __asm putcharfunc(register __a0 struct Hook *h, register __a2 void *object, register __a1 char c);
-
- /*
- * global data
- */
- #define PROGRAMTITLE "Uhr"
- #define TITLE PROGRAMTITLE " " VERSION " © Stefan Sticht"
-
- #define MSG_ERROR_LIBRARY "Couldn't open %s (V%ld)!"
- #define MSG_ERROR_OPENPORT "Couldn't open message port!"
- #define MSG_ATTENTION PROGRAMTITLE ":"
- #define RESUME_GADGETS "Resume"
- #define RETRY_GADGETS "Retry|Cancel"
-
- #ifdef __SASC
- extern struct WBStartup *WBenchMsg;
- extern struct Library *DOSBase;
- extern struct Library *SysBase;
- int CXBRK(void) {return(0);} /* disable Ctrl-C detect */
- int chkabort(void) {return(0);}
- #endif
-
- #define BUFFERSIZE 100
- char buffer[BUFFERSIZE];
-
- struct Hook putcharhook = {
- {NULL, NULL},
- (ULONG)putcharfunc,
- NULL,
- buffer
- };
-
- #define TITLE_OFFSET 7
- static char version[] ="\0$VER: " TITLE;
-
- short bufferpos;
- struct DateStamp datestamp;
- struct Library *GfxBase;
- struct Library *LocaleBase;
- struct Locale *locale;
- struct IntuitionBase *IntuitionBase;
- struct timerequest *timereq;
- struct MsgPort *timerport;
-
- unsigned long updateseconds = 1;
- unsigned long updatemicros = 0;
- long priority = -1;
-
- #define OPTION_FORMAT "FORMAT"
- #define OPTION_UPDATESECONDS "UPDATESECONDS"
- #define OPTION_UPDATEMICROS "UPDATEMICROS"
- #define OPTION_LEFT "LEFT"
- #define OPTION_TOP "TOP"
- #define OPTION_WINDOWTOFRONT "WINDOWTOFRONT"
- #define OPTION_PRIORITY "PRIORITY"
- #define OPTION_PUBSCREEN "PUBSCREEN"
- #define TEMPLATE OPTION_FORMAT "/K," "S=" OPTION_UPDATESECONDS "/K/N," "M=" OPTION_UPDATEMICROS "/K/N,"\
- OPTION_LEFT "/K/N," OPTION_TOP "/K/N," "WTF=" OPTION_WINDOWTOFRONT "/S,"\
- "PRI=" OPTION_PRIORITY "/K/N," OPTION_PUBSCREEN "/K"
- #define OPTN_FORMAT 0
- #define OPTN_UPDATESECONDS 1
- #define OPTN_UPDATEMICROS 2
- #define OPTN_LEFT 3
- #define OPTN_TOP 4
- #define OPTN_WINDOWTOFRONT 5
- #define OPTN_PRIORITY 6
- #define OPTN_PUBSCREEN 7
- #define OPTN_COUNT 8
- long options[OPTN_COUNT];
-
- #define FORMAT (options[OPTN_FORMAT])
- #define WINDOWTOFRONT (options[OPTN_WINDOWTOFRONT])
- #define PUBSCREEN (options[OPTN_PUBSCREEN])
-
- /*
- * functions
- */
-
- /*
- * request(): a glue routine to EasyRequest as simple as printf plus
- * titlestring, gadgettexts
- *
- * Input: char *title: pointer to the title of the requester
- * char *gadgets: pointer to gadgettext
- * char *text: text displayed in requester
- *
- * Result: same as EasyrequestArgs()
- *
- * !!! for more info see EasyRequestArgs() in Autodocs/intuition.doc !!!
- */
- long request(char *title, char *gadgets, char *text, ...)
- {
- /*
- * structure textreq only needed in this function, so hide it here
- * must be static, in order to be initialized only once
- */
- long rc = 0;
- struct EasyStruct textreq = {
- sizeof (struct EasyStruct), /* ULONG es_StructSize */
- 0l, /* ULONG es_Flags */
- NULL, /* UBYTE *es_Title */
- NULL, /* UBYTE *es_TextFormat */
- NULL, /* UBYTE *es_GadgetFormat */
- };
- struct Process *process;
- struct Window *win;
- va_list ap;
-
- /*
- * get start of variable arguments
- */
- va_start(ap, text);
-
- if (process = (struct Process *)FindTask(NULL)) {
- if ((long)(win = process->pr_WindowPtr) != -1) {
-
- /*
- * update textreq
- */
- textreq.es_Title = (UBYTE *)title;
- textreq.es_TextFormat = (UBYTE *)text;
- textreq.es_GadgetFormat = (UBYTE *)gadgets;
-
- rc = EasyRequestArgs(win, &textreq, NULL, ap);
-
- }
-
- }
-
- va_end(ap);
-
- return(rc);
- }
-
- /*
- * myopenlibrary(): same as OpenLibrary(), but opens a retry-requester
- * if OpenLibrary() fails, to give the user a chance to
- * copy the library to libs: and retry
- * requires request(), see above
- */
- struct Library __regargs *myopenlibrary(char *name, unsigned long version)
- {
- struct Library *libptr;
- long ok = TRUE;
-
- do {
- if (!(libptr = OpenLibrary((UBYTE *)name, version))) {
- ok = request(MSG_ATTENTION, RETRY_GADGETS, MSG_ERROR_LIBRARY, name, version);
- }
- } while (!libptr && ok);
-
- return(libptr);
- }
-
- void _main(char *line)
- {
- long rc = RETURN_FAIL;
- struct DiskObject *diskobj = NULL;
- struct Library *IconBase = NULL;
- struct RDArgs *args = NULL;
- struct Screen *scr;
- struct Task *mytask;
- struct Window *win;
- char startpri;
- #define WIDTH_OF_CLOSE_GADGET 20
- #define WIDTH_OF_DEPTH_GADGET 23
- #define P_WA_Left 0
- #define P_WA_Top 1
- #define P_WA_Width 2
- #define P_WA_Height 3
- #define P_WA_PubScreen 6
- static struct TagItem mywindowtags[] = {
- WA_Left, 0l,
- WA_Top, 0l,
- WA_Width, 0l,
- WA_Height, 0l,
- WA_IDCMP, IDCMP_CLOSEWINDOW,
- WA_Flags, WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_RMBTRAP,
- WA_PubScreen, 0l,
- WA_ScreenTitle, (ULONG)&version[TITLE_OFFSET],
- TAG_END
- };
-
- if (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37l)) {
-
- unsigned long left = -1;
- unsigned long top = -1;
-
- if (!WBenchMsg) {
- /*
- * started from Shell
- *
- * change name of program
- */
- SetProgramName(PROGRAMTITLE);
- /*
- * display banner
- */
- PutStr(&version[TITLE_OFFSET]); PutStr("\n");
- /*
- * parse command line
- */
- if (args = ReadArgs((UBYTE *)TEMPLATE, options, NULL)) {
- if (options[OPTN_UPDATESECONDS]) updateseconds = *((long *)options[OPTN_UPDATESECONDS]);
- if (options[OPTN_UPDATEMICROS]) updatemicros = *((long *)options[OPTN_UPDATEMICROS]);
- if (options[OPTN_TOP]) top = *((long *)options[OPTN_TOP]);
- if (options[OPTN_LEFT]) left = *((long *)options[OPTN_LEFT]);
- if (options[OPTN_PRIORITY]) priority = *((long *)options[OPTN_PRIORITY]);
- rc = 0;
- }
- else {
- /*
- * error parsing args
- */
- PrintFault(IoErr(), NULL);
- }
- }
-
- else if (IconBase = myopenlibrary(ICONNAME, 37l)) {
-
- BPTR olddir = -1l;
- char **tooltypesarray;
- char *tooltype;
- struct WBArg *wbarg;
-
- if (wbarg = &(WBenchMsg->sm_ArgList)[WBenchMsg->sm_NumArgs - 1l]) {
-
- if (wbarg->wa_Name) {
-
- if (wbarg->wa_Lock) olddir = CurrentDir(wbarg->wa_Lock);
-
- if (diskobj = GetDiskObject(wbarg->wa_Name)) {
-
- tooltypesarray = diskobj->do_ToolTypes;
-
- if (tooltype = FindToolType(tooltypesarray, OPTION_FORMAT)) FORMAT = (long)tooltype;
- if (tooltype = FindToolType(tooltypesarray, OPTION_UPDATESECONDS)) updateseconds = atol(tooltype);
- if (tooltype = FindToolType(tooltypesarray, OPTION_UPDATEMICROS)) updatemicros = atol(tooltype);
- if (FindToolType(tooltypesarray, OPTION_WINDOWTOFRONT)) WINDOWTOFRONT = TRUE;
- if (tooltype = FindToolType(tooltypesarray, OPTION_LEFT)) left = atol(tooltype);
- if (tooltype = FindToolType(tooltypesarray, OPTION_TOP)) top = atol(tooltype);
- if (tooltype = FindToolType(tooltypesarray, OPTION_PRIORITY)) priority = atol(tooltype);
- if (tooltype = FindToolType(tooltypesarray, OPTION_PUBSCREEN)) PUBSCREEN = (long)tooltype;
- rc = 0;
-
- } /* if diskobj */
-
- if (olddir != -1l) CurrentDir(olddir);
-
- } /* if wbarg->wa_Name */
-
- } /* if wbarg */
-
- } /* if WBenchMsg && IconBase */
-
- if (!rc && !CheckSignal(SIGBREAKF_CTRL_C) && (GfxBase = myopenlibrary("graphics.library", 37l))) {
-
- rc = RETURN_FAIL;
-
- if (mytask = FindTask(NULL)) {
-
- if (LocaleBase = myopenlibrary("locale.library", 38l)) {
-
- if (locale = OpenLocale(NULL)) {
-
- if (!FORMAT) FORMAT = (long)locale->loc_ShortDateTimeFormat;
-
- if (timerport = CreateMsgPort()) {
-
- if (timereq = CreateIORequest(timerport, sizeof(struct timerequest))) {
-
- if (!OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)timereq, 0l)) {
-
- if (scr = LockPubScreen((UBYTE *)PUBSCREEN)) {
-
- DateStamp(&datestamp);
- bufferpos = 0;
- FormatDate(locale, (STRPTR)FORMAT, &datestamp, &putcharhook);
-
- mywindowtags[P_WA_Width].ti_Data = (ULONG)(TextLength(&scr->RastPort, buffer, strlen(buffer)) + WIDTH_OF_CLOSE_GADGET + 20);
- if (left != -1) mywindowtags[P_WA_Left].ti_Data = left;
- else mywindowtags[P_WA_Left].ti_Data = (ULONG)(scr->Width - mywindowtags[P_WA_Width].ti_Data - WIDTH_OF_DEPTH_GADGET);
- if (top != -1) mywindowtags[P_WA_Top].ti_Data = top;
- mywindowtags[P_WA_Height].ti_Data = (ULONG)(scr->BarHeight + 1);
- mywindowtags[P_WA_PubScreen].ti_Data = (ULONG)scr;
-
- if (win = OpenWindowTagList(NULL, mywindowtags)) {
-
- timereq->tr_node.io_Command = TR_ADDREQUEST;
- timereq->tr_time.tv_secs = 0l;
- timereq->tr_time.tv_micro = 10l;
- SendIO(&(timereq->tr_node));
-
- startpri = SetTaskPri(mytask, priority);
-
- getmessages(win);
-
- SetTaskPri(mytask, (long)startpri);
-
- CloseWindow(win);
-
- rc = 0;
-
- }
-
- UnlockPubScreen(NULL, scr);
- }
-
- CloseDevice((struct IORequest *)timereq);
-
- } /* if OpenDevice() */
-
- else request(MSG_ATTENTION, RESUME_GADGETS, MSG_ERROR_LIBRARY, TIMERNAME, 0);
-
- DeleteIORequest(timereq);
-
- } /* if timereq = CreateIORequest() */
-
- DeleteMsgPort((struct MsgPort *)timerport);
-
- } /* if timerport */
-
- else request(MSG_ATTENTION, RESUME_GADGETS, MSG_ERROR_OPENPORT);
-
- CloseLocale(locale);
-
- }
-
- CloseLibrary(LocaleBase);
-
- }
-
- } /* if mytask */
-
- CloseLibrary(GfxBase);
-
- } /* if GfxBase */
-
- if (!WBenchMsg) {
- if (args) FreeArgs(args);
- }
- else {
- if (diskobj) FreeDiskObject(diskobj);
- if (IconBase) CloseLibrary(IconBase);
- }
-
- CloseLibrary((struct Library *)IntuitionBase);
-
- } /* if IntutionBase */
-
- _exit(rc);
- }
-
- void __saveds __asm putcharfunc(register __a0 struct Hook *h, register __a2 void *object, register __a1 char c)
- {
- if (bufferpos < BUFFERSIZE) ((char *)h->h_Data)[bufferpos++] = c;
- }
-
- void getmessages(struct Window *win)
- {
- struct IntuiMessage *msg;
- unsigned long sigreceived;
- unsigned long idcmpsigflag = 1 << win->UserPort->mp_SigBit;
- unsigned long timersigflag = 1 << timerport->mp_SigBit;
- unsigned long sigstowaitfor = SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_F | idcmpsigflag | timersigflag;
- unsigned short quit = FALSE;
-
- while (!quit) {
-
- sigreceived = Wait(sigstowaitfor);
-
- if (sigreceived & timersigflag) {
- /*
- * signal at timerport
- */
- if (GetMsg(timerport) == (struct Message *)timereq) {
- /*
- * arrived any message ?
- */
- timereq->tr_time.tv_secs = updateseconds;
- timereq->tr_time.tv_micro = updatemicros;
- SendIO(&(timereq->tr_node));
-
- DateStamp(&datestamp);
- bufferpos = 0;
- FormatDate(locale, (STRPTR)FORMAT, &datestamp, &putcharhook);
- SetWindowTitles(win, buffer, (UBYTE*)~0);
- if (WINDOWTOFRONT && (IntuitionBase->FirstScreen == win->WScreen)) WindowToFront(win);
- }
- }
-
- if (sigreceived & idcmpsigflag) {
-
- while ((msg = (struct IntuiMessage *)GetMsg(win->UserPort)) && !quit) {
- /*
- * check and free message
- */
- if (msg->Class == CLOSEWINDOW) quit = TRUE;
- ReplyMsg((struct Message *)msg);
- } /* while msg */
-
- }
-
- if (sigreceived & SIGBREAKF_CTRL_C) quit = TRUE;
- if (sigreceived & SIGBREAKF_CTRL_F) WindowToFront(win);
-
- } /* while !quit */
-
- /*
- * cancel pending IORequest
- */
- AbortIO(&(timereq->tr_node));
- WaitIO((struct IORequest *)timereq);
-
- }
-